/* 列表查询相关逻辑 */
import { reactive, ref, isRef } from 'vue';
import { ElMessage } from 'element-plus';
import { common as Common } from '@/utils/common.js';
import { api as Request } from '@/utils/api';
import { isObject, deepCopy, isFunction } from '@/shared/index.js';
/**
 * 表单查询，重置，分页(前端分页)
 * @param {object} searchData 查询参数
 * @param {string} method 查询表单数据的方法名称
 * @param {RefImpl} disabledbtn 按钮可用与不可用
 * @param {string} pagingType 查询表单数据的方法名称 FRONT_END:前端分页 BACK_END:后端分页
 * @param {number} _pageSize 每页显示几条
 * @param {Array} pageSizes 每页显示个数选择器的选项设置
 * @param {number} _total 总数
 * @param {number} _pageNumber 第几页
 * @returns 
 */
export const useTable = (
  searchData = {}, method = '', disabledbtn, pagingType = 'BACK_END',
  _pageSize = 10, pageSizes = [10, 20, 30, 40, 50, 100],
  _total = 0, _pageNumber = 1) => {
  const total = ref(_total);/* 总数 */
  const pageNumber = ref(_pageNumber);/* 第几页 */
  const pageSize = ref(_pageSize);/* 每页显示几条 */
  const multipleTableRef = ref('');/* 列表组件的引用 */

  const tableLoading = ref(true);/* 列表loading状态 */
  const tableState = reactive({
    tableList: []/* 表格中所有数据 */
  });
  /* 查询条件 */
  const searchCondition = reactive(searchData);
  /* 对象深拷贝 */
  let _searchData = deepCopy(searchData);
  /* 非生产环境下的校验 */
  if (import.meta.env.VITE_ENV !== 'prod') {
    console.log(import.meta.env.VITE_ENV);
    handleInitVerify();
  }

  /* 初始化校验参数 */
  function handleInitVerify () {
    if (!isObject(searchData)) console.error('查询条件需要是一个对象');
    if (method === '') console.error('请填写查询表单的方法名称');
    if (!isRef(disabledbtn)) console.error('disabledbtn需要是一个响应式的ref对象');
    if (pagingType === 'BACK_END') {
      if (searchCondition.current === undefined) console.error('请传入正确的获取列表第几页的字段名称');
      if (searchCondition.size === undefined) console.error('请传入正确的获取列表每页获取几条数据的的字段名称');
    }
    if (!['FRONT_END', 'BACK_END'].includes(pagingType)) console.error('请传入正确的分页类型，默认后端分页，前端分页传：FRONT_END');
    if (!pageSizes.includes(_pageSize)) console.error('每页显示几条(_pageSize),需要在 每页显示个数选择器的选项设置(pageSizes)中');
  }

  /* 搜索 */
  function searchInfo () {
    if (pagingType === 'BACK_END') {
      /* 注意这里的current必须是后端请求参数所对应的名称[也可以做成可配置的] */
      searchCondition.current = 1;
      searchCondition.size = pageSize.value;
    } else if (pagingType === 'FRONT_END') {
      pageNumber.value = 1;
    }
    getTableInfo();
  }

  /**
   * 重置搜索内容
   * @param {function || object} fn 回调函数，用于重置额外的一些参数 || 点击事件的对象
   * @param {object} e 点击事件的对象
   */
  function resetSearch (fn, e) {
    for (const key of Object.keys(_searchData)) {
      searchCondition[key] = _searchData[key];
    }
    /* 分页也重置到默认分页 */
    if (pagingType === 'BACK_END') {
      /* 注意这里的current必须是后端请求参数所对应的名称[也可以做成可配置的] */
      searchCondition.current = 1;
      searchCondition.size = _pageSize;
    } else if (pagingType === 'FRONT_END') {
      pageNumber.value = 1;
      pageSize.value = _pageSize;
    }
    /* 兼容按钮默认会传递一个object */
    isFunction(fn) && fn();
    getTableInfo();
  }

  /* 显示第几页 */
  function handleCurrentChange (val) {
    if (pagingType === 'BACK_END') {
      /* if (val === null) return; 后端分页，缓存路由activated请求的时候做的兼容 */
      if (val === null) return;
      /* 注意这里的current必须是后端请求参数所对应的名称[也可以做成可配置的] */
      searchCondition.current = val;
      getTableInfo();
    } else if (pagingType === 'FRONT_END') {
      pageNumber.value = val;
    }
  }

  /* 每页显示几条 */
  function handleSizeChange (val) {
    if (pagingType === 'BACK_END') {
      /* 注意这里的current必须是后端请求参数所对应的名称[也可以做成可配置的] */
      searchCondition.current = 1;
      searchCondition.size = val;
      getTableInfo();
    } else if (pagingType === 'FRONT_END') {
      pageSize.value = val;
    }
  }

  /* 请求：获取表格中数据 */
  function getTableInfo () {
    disabledbtn.value = true;
    tableLoading.value = true;
    Request[method](searchCondition)
      .then(res => {
        if (pagingType === 'BACK_END') {
          tableState.tableList = res.result.data;
          total.value = res.result.total;
        } else if (pagingType === 'FRONT_END') {
          tableState.tableList = res.result;
          total.value = res.result.length;
        }
      })
      .catch(error => {
        console.log(error);
      }).finally(() => {
        disabledbtn.value = false;
        tableLoading.value = false;
      });
  }

  /* 双击当前行 */
  function rowDblclick (row) {
    multipleTableRef.value.toggleRowSelection(row)
  }

  /* 批量删除 */
  function batchDelete (method) {
    /* 获取选中的数据 */
    let selection = multipleTableRef.value.store.states.selection.value;
    if (selection.length === 0) {
      ElMessage.warning('请至少选择一条数据');
      return;
    }
    let idArray = [];
    for (const item of selection) {
      idArray.push(item.id);
    }
    deleteInfo(method, idArray);
  }
  /* 删除后的信息 */
  function deleteInfo (method, idArray) {
    disabledbtn.value = true;
    tableLoading.value = true;
    Request[method]({ idArray })
      .then((res) => {
        /* 当删除成功后，删除对应选中的数据或单个数据 */
        Common.handleSelectDeleteData(idArray, tableState.tableList);
        ElMessage.success(`成功删除了${idArray.length}条数据`);
        multipleTableRef.value.clearSelection();
        total.value = total.value - idArray.length;
      })
      .catch(error => {
        console.log(error);
      }).finally(() => {
        disabledbtn.value = false;
        tableLoading.value = false;
      });
  }

  if (pagingType === 'BACK_END') {
    /* 后端分页返回的数据 */
    return {
      total, pageSizes, multipleTableRef, tableLoading, tableState, searchCondition,
      handleCurrentChange, handleSizeChange, getTableInfo, searchInfo, resetSearch, batchDelete, deleteInfo, rowDblclick
    }
  } else if (pagingType === 'FRONT_END') {
    /* 前端分页返回的数据 */
    return {
      total, pageNumber, pageSize, pageSizes, multipleTableRef, tableLoading, tableState, searchCondition,
      handleCurrentChange, handleSizeChange, getTableInfo, searchInfo, resetSearch, batchDelete, deleteInfo, rowDblclick
    }
  }
}
